package fr.esisar.cs420.traitement;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class GestionAdmin {

	/**
	 * Méthode permettant de retourner le nombre de commandes.
	 * @return
	 * 		nombre de commandes
	 * @throws SQLException
	 */
	public static String getNbCommande() throws SQLException {
		Statement stmt = Application.getStmt();
		
		//Requête retournant le nombre de commandes.
		String req = "select count(idcommande) from commande";
		ResultSet rset = stmt.executeQuery(req);
		
		String nbCommandes = "0";
		if ( rset.next() ){
			nbCommandes = rset.getString(1);
		}

		//Fin de la transaction
		stmt.executeUpdate("COMMIT");
		rset.close();
		return nbCommandes;
	}
	
	/**
	 * Méthode permettant de retourner le prix moyen des commandes.
	 * @return
	 * 			prix moyen des commandes
	 * @throws SQLException
	 */
	public static String getPrixMoyenCommandes() throws SQLException {
		Statement stmt = Application.getStmt();
		
		//Requête retournant le prix moyen de toutes les commandes.
		String req = "select round(avg(prixtotal),2) from commande";
		ResultSet rset = stmt.executeQuery(req);
		
		String prixMoyen ="";
		if ( rset.next() ){
			if ( rset.getString(1) == null ){
				prixMoyen = "0";
			}
			else{
				prixMoyen = rset.getString(1);
			}
		}
		
		
		//Fin de la transaction.
		stmt.executeUpdate("COMMIT");
		rset.close();
		return prixMoyen;
	}
	/**
	 * Méthode permettant de retouner le meilleur client.
	 * 
	 * @return
	 * 			Client
	 * @throws SQLException
	 */
	public static Client getMeilleurClient() throws SQLException {
		Client client = new Client();
		Statement stmt = Application.getStmt();
		
		//Requête selectionnant le meilleur client considéré comme celui dont la somme des commandes est la plus grande.
		String req = "select nom,prenom,adresse,ville,mail from client where mail IN (select c.idclient from commande c having sum(c.prixtotal) >= ANY (select sum(prixtotal) from commande group by idclient) group by idclient)";
		ResultSet rset = stmt.executeQuery(req);
		
		if( rset.next()  ){			
			//Insertion des resultats dans l'objet client.
			client.setNom( rset.getString(1) ) ;
			client.setPrenom( rset.getString(2) );
			client.setAdresse( rset.getString(3) );
			client.setVille( rset.getString(4) );
			client.setMail( rset.getString(5) );
		}
		else{
			client.setNom( "" ) ;
			client.setPrenom( "" );
			client.setAdresse( "" );
			client.setVille( "" );
			client.setMail( "" );
		}
		//Fin de la transaction
		stmt.executeUpdate("COMMIT");
		rset.close();
		return client;
	}
	
	/**
	 * Méthode permettant de retourner le nombre de commandes 
	 * par jour ( NUL quand il y a 0 commandes s )
	 * @return
	 * 			List<String>
	 * @throws SQLException
	 */
	public static List<String> getStat() throws SQLException{
		List<String> stat = new ArrayList<String>();
		Statement stmt = Application.getStmt();
		
		//On compte le nombre de commandes pour chaque journée
		String req = "select to_char(datecommande,'dd/mm'),count(idcommande) from commande group by TO_CHAR(datecommande,'dd/mm') order by TO_CHAR(datecommande,'dd/mm') ASC";
		ResultSet rset = stmt.executeQuery(req);
		
		//Insertion des résultats dans la liste
		int i =0;
		while( rset.next() ){
			stat.add(rset.getString(1)+" "+rset.getString(2));
			i++;
		}
		if( i == 0 ){
			stat.add("null");
		}
		
		//Fin de la transaction
		stmt.executeUpdate("COMMIT");
		rset.close();
		return stat;
	}
	
	/**
	 * Méthode permettant de retourner le nombre de clients.
	 * @return
	 * 		Nombre de clients enregistrés dans le système.
	 * @throws SQLException
	 */

	public static String getNbClients() throws SQLException {
		Statement stmt = Application.getStmt();
		
		//Requête retournant le nombre de client dans le système.
		String req = "select count(mail) from client";
		ResultSet rset = stmt.executeQuery(req);
		
		String nbClient = "0";
		if ( rset.next() ){
			nbClient = rset.getString(1);
		}
		
		//Fin de la transaction.
		stmt.executeUpdate("COMMIT");
		rset.close();
		return nbClient;
	}

}
